Cookbook Community Meetup - 12pm ET / 5pm GMT every week on Wednesdays

Language
Docs

Documentation

Contributors: Tom Wilson
Last Updated:

React Starter Kit w/vite & ArDrive

This guide will walk you through in a step by step flow to configure your development environment to build and deploy a permaweb react application.

Prerequisites

  • Basic Typescript Knowledge (Not Mandatory) - [https://www.typescriptlang.org/docs/](Learn Typescript)
  • NodeJS v16.15.0 or greater - [https://nodejs.org/en/download/](Download NodeJS)
  • Knowledge of ReactJS - [https://reactjs.org/](Learn ReactJS)
  • Know git and common terminal commands

Development Dependencies

  • TypeScript
  • NPM or Yarn Package Manager

Steps

Install ardrive cli

npm i -g ardrive-cli

NOTE: if you do not have a wallet, lets create one for uploading apps.

Create Seed Phrase

ardrive generate-seedphrase

Copy the output to use to generate wallet

Create Wallet

ardrive generate-wallet -s "SEED_PHRASE_FROM_ABOVE" > wallet.json

Create React App

yarn create vite my-arweave-app --template react-ts
cd my-arweave-app
yarn

Add React Router DOM

yarn add react-router-dom

We need to use the hash-router to create a working app on arweave.

Page Components

touch src/Home.tsx src/About.tsx

src/Home.tsx

import { Link } from "react-router-dom";

function Home() {
	return (
		<div>
			Welcome to the Permaweb!
			<Link to={"/about/"}>
				<div>About</div>
			</Link>
		</div>
	);
}

export default Home;

src/About.tsx

import { Link } from "react-router-dom";

function About() {
	return (
		<div>
			Welcome to the About page!
			<Link to={"/"}>
				<div>Home</div>
			</Link>
		</div>
	);
}

export default About;

Modify App.tsx

We need to update the App.tsx to manage different pages

import { HashRouter } from "react-router-dom";
import { Routes, Route } from "react-router-dom";

import Home from "./Home";
import About from "./About";

function App() {
	return (
		<HashRouter>
			<Routes>
				<Route path={"/"} element={<Home />} />
				<Route path={"/about/"} element={<About />} />
			</Routes>
		</HashRouter>
	);
}

export default App;

Modify index.css

Alter the body selector

body {
  margin: 0;
  padding-top: 200px;
  display: flex;
  flex-direction: column;
  place-items: center;
  min-width: 100%;
  min-height: 100vh;
}
yarn dev

Building React App

Modify vite.config.ts

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

// https://vitejs.dev/config/
export default defineConfig({
  base: "",
  plugins: [react()],
})

Build App

yarn build

Publishing to Arweave

create drive

ardrive create-drive -w ../wallet.json -n my-arweave-app --turbo

create folder

ardrive create-folder -w ../wallet.json -n "v1" -F __ROOT_FOLDER_ID__ --turbo
export V1=__FOLDER_ID__

upload files

cd dist
ardrive upload-file -w ../../wallet.json -l ./ -F ${V1} --turbo

create manifest

cd ..
ardrive create-manifest -w ../wallet.json -f ${V1} --turbo --dry-run

NOTE: We need to grab the manifest object and edit it, we need to change the index to point to "index.html", and remove all of the "./" for each path, save file as manifest.json in the app root directory.

ardrive upload-file -w ../wallet.json -l ./manifest.json --content-type application/x.arweave-manifest+json -F ${V1} --turbo

Congrats!

You just published a react application on the Permaweb! This app will be hosted forever!